梦想不会自己发光,真正闪耀的是那个为梦狂奔的你。献给知行的孩子们!(Eric.He著)
本教程将从 C++ 数据输入输出的核心分类入手,全面讲解单字符输入输出、流式输入输出、格式化输入输出的用法,并对比分析不同输入输出方式的特性,帮助你掌握C++程序与外部交互的核心技能。
C++ 输入输出(I/O)是程序与外部设备(键盘、屏幕、文件等)交互的核心机制,主要分为三大类:单字符输入输出(面向单个字符)、流式输入输出(C++标准库iostream)、格式化输入输出(兼容C语言的stdio)。
不同输入输出方式适用于不同场景,核心差异体现在易用性、灵活性、性能和跨平台性上,掌握其特性是编写高效交互程序的基础。
单字符输入输出专注于单个字符的读取和输出,是最基础的I/O方式,分为C语言风格和C++风格两种实现。
// C语言风格:putchar(标准库 stdio.h)
#include <cstdio>
putchar(字符/ASCII码);
// C++风格:cout.put(标准库 iostream)
#include <iostream>
std::cout.put(字符/ASCII码);
#include <iostream>
#include <cstdio>
using namespace std;
int main() {
// C语言风格单字符输出
putchar('A'); // 输出字符A
putchar(65); // 输出ASCII码65对应的字符A
putchar('\n'); // 输出换行符
// C++风格单字符输出
cout.put('B'); // 输出字符B
cout.put(66); // 输出ASCII码66对应的字符B
cout.put('\n'); // 输出换行符
return 0;
}
输出结果:
A
A
B
B
// C语言风格:getchar(标准库 stdio.h)
#include <cstdio>
char ch = getchar(); // 从键盘读取单个字符(需按回车)
// C++风格:cin.get(标准库 iostream)
#include <iostream>
char ch;
std::cin.get(ch); // 读取单个字符到ch
char ch2 = std::cin.get(); // 读取单个字符并返回
#include <iostream>
#include <cstdio>
using namespace std;
int main() {
// C语言风格单字符输入
cout << "请输入一个字符(C风格):";
char ch1 = getchar();
cout << "你输入的字符是:";
putchar(ch1);
putchar('\n');
// 清除输入缓冲区(避免残留字符影响后续输入)
while (getchar() != '\n');
// C++风格单字符输入
cout << "请输入一个字符(C++风格):";
char ch2;
cin.get(ch2);
cout << "你输入的字符是:";
cout.put(ch2);
cout.put('\n');
return 0;
}
输入输出示例:
请输入一个字符(C风格):X
你输入的字符是:X
请输入一个字符(C++风格):Y
你输入的字符是:Y
流式输入输出是C++特有的I/O方式,基于<iostream>标准库,通过cout(输出流)、cin(输入流)实现,支持任意数据类型的输入输出,无需指定格式符,易用性高。
cout 是输出流对象,通过 << 运算符向标准输出设备(屏幕)输出数据,支持链式调用。
#include <iostream>
std::cout << 数据1 << 数据2 << ... << endl;
#include <iostream>
using namespace std;
int main() {
// 基本数据类型输出
int a = 100;
float b = 3.14159;
char c = 'Z';
string s = "Hello C++";
// 链式输出
cout << "整数:" << a << endl; // 输出整数
cout << "浮点数:" << b << endl; // 输出浮点数
cout << "字符:" << c << endl; // 输出字符
cout << "字符串:" << s << endl; // 输出字符串
// 混合输出
cout << "组合输出:a=" << a << ", b=" << b << ", c=" << c << endl;
return 0;
}
输出结果:
整数:100
浮点数:3.14159
字符:Z
字符串:Hello C++
组合输出:a=100, b=3.14159, c=Z
cin 是输入流对象,通过>>运算符从标准输入设备(键盘)读取数据,自动根据变量类型解析输入。
#include <iostream>
std::cin >> 变量1 >> 变量2 >> ...;
#include <iostream>
#include <string>
using namespace std;
int main() {
int age;
float score;
string name;
cout << "请输入姓名、年龄、成绩(空格分隔):";
cin >> name >> age >> score;
cout << "\n你的信息:" << endl;
cout << "姓名:" << name << endl;
cout << "年龄:" << age << endl;
cout << "成绩:" << score << endl;
return 0;
}
输入输出示例:
请输入姓名、年龄、成绩(空格分隔):小明 18 95.5
你的信息:
姓名:小明
年龄:18
成绩:95.5
cin 以空白字符(空格、回车、制表符)作为输入分隔符,无法直接读取带空格的字符串;cin.ignore()清除;endl 会刷新输出缓冲区,确保数据立即显示,而\n仅换行不刷新;<</>>运算符。
#include <iostream>
#include <string>
using namespace std;
int main() {
string str;
cout << "请输入带空格的字符串:";
cin.ignore(); // 清除输入缓冲区的换行符
getline(cin, str); // 读取整行(包含空格)
cout << "你输入的字符串:" << str << endl;
return 0;
}
输入输出示例:
请输入带空格的字符串:Hello World C++
你输入的字符串:Hello World C++
格式化输入输出兼容C语言标准库,通过printf()输出函数、scanf()输入函数实现,需指定格式符,灵活性高、性能好,是高性能程序的常用选择。
printf函数的功能是格式化输出任意数据列表,其一般调用格式为:
#include <cstdio>
printf(格式控制, 输出列表);
【说明】
(1)格式控制:由格式说明和普通字符组成,必须用双引号括起来。
1、格式说明由%和格式字符组成,作用是将要输出的字符转换为指定的格式,如%d,%c等。
2、普通字符是在输出时原样输出的字符,一般在显示时起提示作用。
(2)输出列表:是需要输出的一组数据(可以为表达式和变量),各参数之间用“,”分开。
要求格式说明和各输出项在数量和类型上要一一对应,否则将会出现意想不到的错误。
【实例】
int a,b;
printf("%d%d",a,b);
| 格式符 | 说明 |
|---|---|
| %d或%i | 以带符号的十进制形式输出整数,正数的(+)号省略不输出 |
| %u | 以无符号十进制形式输出整数 |
| %o(字母) | 以八进制无符号形式输出整数 |
| %x(字母) | 以十六进制无符号形式输出整数 |
| %c | 输出一个字符 |
| %s | 输出字符串 |
| %f | 以小数形式输出单、双精度,隐含输出6位小数 |
| %e或%E | 以指数形式输出单、双精度,隐含输出6位小数 |
| %g或%G | 自动选用%f、%e、%E格式中输出宽度较小的一种使用 |
| 参数 | 说明 |
|---|---|
| %d | 输出数字长为变量数值的实际长度 |
| %md | 输出m位(不足补空格,大于m位时按实际长度输出) |
| %-md | m含义同上。左对齐输出 |
| %ld | l(小写字母)表示输出“长整型”数据 |
| %mld | 指定长整型输出宽度m位,左边补空格;否则,按实际位数输出 |
| %0md,%0mld | 0(数字0)表示位数不足m时补0 |
| 参数 | 说明 |
|---|---|
| %f | 按实数格式输出,整数部分按实际位数输出,6位小数 |
| %m.nf | 总位数m(含小数点),其中有n位小数 |
| %-m.nf | 总位数m(含小数点),其中有n位小数,左对齐 |
| 参数 | 说明 |
|---|---|
| %s | 按实际宽度输出一个字符串 |
| %ms | m指定宽度(不足时左补空格,大于时按实际宽度输出) |
| %-ms | 左对齐,不足时右补空格 |
| %m.ns | 输出占m个字符位置,其中字符数量最多n个,左补空格 |
| %-m.ns | 输出占m个字符位置,其中字符数量最多n个,右补空格 |
#include <cstdio>
int main() {
int a = 100;
float b = 3.1415926;
char c = 'A';
char str[] = "Hello C";
// 基本格式化输出
printf("整数:%d\n", a); // %d 十进制整数
printf("浮点数(默认):%f\n", b); // %f 浮点数
printf("浮点数(保留2位):%.2f\n", b); // 保留2位小数
printf("字符:%c\n", c); // %c 字符
printf("字符串:%s\n", str); // %s 字符串
// 混合格式化输出
printf("组合:a=%d, b=%.3f, c=%c\n", a, b, c);
// 进制输出
printf("十六进制:%x\n", a); // 十六进制(小写)
printf("八进制:%o\n", a); // 八进制
return 0;
}
输出结果:
整数:100
浮点数(默认):3.141593
浮点数(保留2位):3.14
字符:A
字符串:Hello C
组合:a=100, b=3.142, c=A
十六进制:64
八进制:144
scanf函数的功能是格式化输入任意数据列表,其一般调用格式为:
#include <cstdio>
scanf(格式控制符, 地址列表);
【说明】
(1)格式控制符由%和格式符组成,作用是将要输入的字符按指定的格式输入,如%d,%c等。
(2)地址列表中给出各变量的地址,可以是变量的地址,也可以是字符串的首地址。
【实例】
int a,b;
scanf("%d%d",&a,&b);
| 格式符 | 说明 |
|---|---|
| %d或%i | 用于输入十进制整数 |
| %u | 以无符号十进制形式输入十进行制整数 |
| %o | 用于输入八进制整数 |
| %x | 用于输入十六进制整数 |
| %c | 用于输入单个字符 |
| %s | 用于输入字符串(非空格开始,空格结束,字符串变量以'\0'结尾) |
| %f | 用于输入实数(小数或指数均可) |
| %e | 与f相同(可与f互换) |
| 附加格式 | 说明 |
|---|---|
| l(字母) | 用于长整型数(%ld、%lo、%lx)或double型实数(%lf、%le) |
| h | 用于短整型数(%hd、%ho、%hx) |
| 域宽(一个整数) | 指定输入所占列宽。只读取 域宽指定个数 的字符作为输入,多了不要! |
| * | 表示对应键盘输入的数据不赋给一个变量。只读入,不存进变量,直接扔掉! |
#include <cstdio>
int main() {
int age;
float score;
char name[20];
printf("请输入姓名、年龄、成绩:");
scanf("%s %d %f", name, &age, &score); // 注意变量地址(除字符串)
printf("\n格式化输入结果:\n");
printf("姓名:%s\n", name);
printf("年龄:%d\n", age);
printf("成绩:%.1f\n", score);
return 0;
}
输入输出示例:
请输入姓名、年龄、成绩:小红 19 88.5
格式化输入结果:
姓名:小红
年龄:19
成绩:88.5
| 输入输出方式 | 头文件 | 使用场景 | 优点 | 缺点 |
|---|---|---|---|---|
| 单字符I/O(getchar/putchar/cin.get/cout.put) | cstdio / iostream | 仅需处理单个字符的场景(如字符逐行解析、终端交互) | 轻量、高效、无格式转换开销 | 功能单一,仅支持字符,不支持复杂类型 |
| 流式I/O(cin/cout) | iostream | 常规程序交互、跨平台开发、简单数据输入输出 | 无需格式符、类型安全、易用性高、支持C++特性(如字符串) | 性能略低、格式化控制复杂、输入分隔符限制 |
| 格式化I/O(scanf/printf) | cstdio | 高性能程序、批量数据处理、精准格式控制 | 性能高、格式控制灵活、兼容C语言、代码简洁 | 无类型安全、需手动管理格式符、不支持C++字符串(std::string) |
,格式化I/O需包含,格式化控制符(setprecision等)需包含;fflush(stdin)或cin.ignore());ios::sync_with_stdio(false);提升cin/cout性能);本教程全面讲解了C++数据输入输出的核心用法和对比分析,掌握不同I/O方式的特性和适用场景,是编写高效、健壮C++程序的关键。